GskGLRenderer: Add debug groups
authorAlexander Larsson <alexl@redhat.com>
Wed, 24 Apr 2019 11:28:11 +0000 (13:28 +0200)
committerAlexander Larsson <alexl@redhat.com>
Thu, 25 Apr 2019 09:36:21 +0000 (11:36 +0200)
This adds debug groups in various places, including the debug
nodes if those are in use. This makes the traces in tools like
renderdoc much easier to read.

gsk/gl/gskglglyphcache.c
gsk/gl/gskglrenderer.c
gsk/gl/gskglrenderops.c
gsk/gl/gskglrenderopsprivate.h

index d3627fb8ea5f8371a90077c65950dd02e2556fac..d3ad7a79c8c3de4ee71874bfa8dfd9b89263d3ce 100644 (file)
@@ -262,10 +262,15 @@ upload_dirty_glyph (GskGLGlyphCache *self,
 
   g_assert (atlas->pending_glyph.key != NULL);
 
+  gdk_gl_context_push_debug_group_printf (gsk_gl_driver_get_gl_context (self->gl_driver),
+                                          "Uploading glyph %d", atlas->pending_glyph.key->glyph);
+
   render_glyph (atlas, &atlas->pending_glyph, &region);
 
   gsk_gl_image_upload_regions (atlas->image, self->gl_driver, 1, &region);
 
+  gdk_gl_context_pop_debug_group (gsk_gl_driver_get_gl_context (self->gl_driver));
+
   g_free (region.data);
 
   atlas->pending_glyph.key = NULL;
index 7d928dd3e14ca08430faa691040940f0d2117682..24b81c6d3f495a728a8ce440b872afecd450a68a 100644 (file)
@@ -2517,9 +2517,11 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
     break;
 
     case GSK_DEBUG_NODE:
+      ops_push_debug_group (builder, gsk_debug_node_get_message (node));
       gsk_gl_renderer_add_render_ops (self,
                                       gsk_debug_node_get_child (node),
                                       builder);
+      ops_pop_debug_group (builder);
     break;
 
     case GSK_COLOR_NODE:
@@ -2784,7 +2786,9 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self,
           op->op == OP_CHANGE_VAO)
         continue;
 
-      if (op->op != OP_CHANGE_PROGRAM &&
+      if (op->op != OP_PUSH_DEBUG_GROUP &&
+          op->op != OP_POP_DEBUG_GROUP &&
+          op->op != OP_CHANGE_PROGRAM &&
           op->op != OP_CHANGE_RENDER_TARGET &&
           op->op != OP_CLEAR &&
           program == NULL)
@@ -2889,6 +2893,14 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self,
           dump_framebuffer (op->dump.filename, op->dump.width, op->dump.height);
           break;
 
+        case OP_PUSH_DEBUG_GROUP:
+          gdk_gl_context_push_debug_group (self->gl_context, op->debug_group.text);
+          break;
+
+        case OP_POP_DEBUG_GROUP:
+          gdk_gl_context_pop_debug_group (self->gl_context);
+          break;
+
         default:
           g_warn_if_reached ();
         }
@@ -2981,7 +2993,9 @@ gsk_gl_renderer_do_render (GskRenderer           *renderer,
   if (fbo_id != 0)
     ops_set_render_target (&self->op_builder, fbo_id);
 
+  gdk_gl_context_push_debug_group (self->gl_context, "Adding render ops");
   gsk_gl_renderer_add_render_ops (self, root, &self->op_builder);
+  gdk_gl_context_pop_debug_group (self->gl_context);
 
   /* We correctly reset the state everywhere */
   g_assert_cmpint (self->op_builder.current_render_target, ==, fbo_id);
@@ -3010,7 +3024,9 @@ gsk_gl_renderer_do_render (GskRenderer           *renderer,
   glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
   glBlendEquation (GL_FUNC_ADD);
 
+  gdk_gl_context_push_debug_group (self->gl_context, "Rendering ops");
   gsk_gl_renderer_render_ops (self, buffer_size);
+  gdk_gl_context_pop_debug_group (self->gl_context);
 
 #ifdef G_ENABLE_DEBUG
   gsk_profiler_counter_inc (profiler, self->profile_counters.frames);
@@ -3038,6 +3054,9 @@ gsk_gl_renderer_render_texture (GskRenderer           *renderer,
 
   g_return_val_if_fail (self->gl_context != NULL, NULL);
 
+  gdk_gl_context_push_debug_group_printf (self->gl_context,
+                                          "Render %s<%p> to texture", root->node_class->type_name, root);
+
   width = ceilf (viewport->size.width);
   height = ceilf (viewport->size.height);
 
@@ -3075,6 +3094,9 @@ gsk_gl_renderer_render_texture (GskRenderer           *renderer,
                                 NULL, NULL);
 
   gsk_gl_driver_end_frame (self->gl_driver);
+
+  gdk_gl_context_pop_debug_group (self->gl_context);
+
   gsk_gl_renderer_clear_tree (self);
   return texture;
 }
@@ -3093,6 +3115,9 @@ gsk_gl_renderer_render (GskRenderer          *renderer,
   if (self->gl_context == NULL)
     return;
 
+  gdk_gl_context_push_debug_group_printf (self->gl_context,
+                                          "Render root node %p", root);
+
   surface = gsk_renderer_get_surface (renderer);
   whole_surface = (GdkRectangle) {
                       0, 0,
@@ -3138,6 +3163,8 @@ gsk_gl_renderer_render (GskRenderer          *renderer,
 
   gdk_draw_context_end_frame (GDK_DRAW_CONTEXT (self->gl_context));
 
+  gdk_gl_context_pop_debug_group (self->gl_context);
+
   g_clear_pointer (&self->render_region, cairo_region_destroy);
 }
 
index 34a7361bcf64f4a1430b5f04ac53f9f5b2657501..78526f62b4deb06c7b9a88748fa172ef5c88ed55 100644 (file)
@@ -58,6 +58,28 @@ ops_dump_framebuffer (RenderOpBuilder *builder,
   g_array_append_val (builder->render_ops, op);
 }
 
+void
+ops_push_debug_group (RenderOpBuilder *builder,
+                      const char      *text)
+{
+  RenderOp op;
+
+  op.op = OP_PUSH_DEBUG_GROUP;
+  strncpy (op.debug_group.text, text, sizeof(op.debug_group.text) - 1);
+  op.debug_group.text[sizeof(op.debug_group.text) - 1] = 0; /* Ensure zero terminated */
+
+  g_array_append_val (builder->render_ops, op);
+}
+
+void
+ops_pop_debug_group (RenderOpBuilder *builder)
+{
+  RenderOp op;
+
+  op.op = OP_POP_DEBUG_GROUP;
+  g_array_append_val (builder->render_ops, op);
+}
+
 float
 ops_get_scale (const RenderOpBuilder *builder)
 {
index a2608b7450d12174383721a806cdc7e0e42ceab9..995188fe126cf6c14a465e97bbbdb16551ef2a4c 100644 (file)
@@ -59,6 +59,8 @@ enum {
   OP_CLEAR                  =  21,
   OP_DRAW                   =  22,
   OP_DUMP_FRAMEBUFFER       =  23,
+  OP_PUSH_DEBUG_GROUP       =  24,
+  OP_POP_DEBUG_GROUP        =  25,
 };
 
 typedef struct
@@ -217,6 +219,9 @@ typedef struct
       int width;
       int height;
     } dump;
+    struct {
+      char text[180]; /* Size of linear_gradient, so 'should be enough' without growing RenderOp */
+    } debug_group;
   };
 } RenderOp;
 
@@ -278,6 +283,10 @@ void              ops_dump_framebuffer   (RenderOpBuilder         *builder,
                                           int                      width,
                                           int                      height);
 void              ops_init               (RenderOpBuilder         *builder);
+void              ops_push_debug_group    (RenderOpBuilder         *builder,
+                                           const char              *text);
+void              ops_pop_debug_group     (RenderOpBuilder         *builder);
+
 void              ops_finish             (RenderOpBuilder         *builder);
 void              ops_push_modelview     (RenderOpBuilder         *builder,
                                           const graphene_matrix_t *mv,